home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / dolmorph / src / makemov.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-19  |  29.3 KB  |  1,125 lines

  1.  
  2.  
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <winb.h>
  8. #include <te.h>
  9. #include <fntb.h>
  10. #include <gui.h>
  11. #include <file_dlg.h>
  12. #include <tifflib.h>
  13. #include <egb.h>
  14. #include <mos.h>
  15. #include <snd.h>
  16.  
  17. #include "makemov.h"
  18.  
  19. #define    MALLOC        TL_malloc
  20. #define    FREE        TL_free
  21.  
  22. static struct {
  23.     int        frame;
  24.     int        total_byte;
  25.     int        rough;
  26.     int        premove;
  27.     int        x0,y0,x1,y1;
  28.     int        b,r,g;
  29.     int        soft;
  30.     int        color_rate, mode;        // 外部からいじってはだめ
  31.     int        wait;
  32. } svar = { 0,0,0,0, 0,0,319,239, 0,0,0, 0,0,0, 0 };
  33.  
  34. /*
  35.     外部に必要な関数:
  36.         int LoadFrame(char *buf, int nFrame, int *nWidth, int *nHeight);
  37.             // buf : 320×240×2バイトのバッファ
  38.             // nFrame : フレーム番号(0~ total-1)
  39.             // *nWidth, *nHeight : 用意したフレームの大きさを格納する
  40.             //                        (or NULL)
  41.         返り値: 0=フレームの用意ができた -1:失敗
  42. */
  43.  
  44. static int nFrameWid, nFrameHt;
  45. static char *pImageBuf;
  46. static int scount0;
  47.  
  48. static char *rbuf,*bbuf;
  49.  
  50. #define    GETRGB(pixel, r,g,b)        \
  51. {                                    \
  52.     b = (pixel) & 0x1f;                \
  53.     r = ((pixel) >>  5) & 0x1f;        \
  54.     g = ((pixel) >> 10) & 0x1f;        \
  55. }
  56.  
  57. #define INTSWAP(a,b)   {int t=a; a=b; b=t;}
  58.  
  59. /*--------------------------------------------------------*/
  60. /*          pImageBuf の内容にソフトネスをかける          */
  61. /*--------------------------------------------------------*/
  62.  
  63.     int mov_save_soft( char *buffer )
  64.     // pImageBuf(320*240,word array) の内容にソフトネスをかけ、
  65.     // 結果を buffer(320*240,word array) に出力
  66.         // buffer: 320*240*2 bytes buffer
  67.         //   ソフトネスをかけた結果の出力先
  68.     {
  69.         int x,y;
  70.         for ( y=svar.y0 ; y<=svar.y1 ; y++ )
  71.         {
  72.             for( x=svar.x0 ; x<=svar.x1 ; x++ )
  73.             {
  74.                 int b,r,g;
  75.                 int n;
  76.                 b = r = g = 0;
  77.                 n = 0;
  78.               // 各原色の強さの和をもとめる
  79.                 int ix,iy;
  80.                 for (iy=y-1; iy<=y+1; iy++)
  81.                 {
  82.                     if (iy < 0 || 240 <= iy)
  83.                         continue;
  84.                     for ( ix=x-1; ix<=x+1; ix++ )
  85.                     {
  86.                         if (0 <= ix && ix < 320)
  87.                         {
  88.                             int pix;
  89.                             pix = WORD(pImageBuf+iy*640+ix*2);
  90.                             b += (   pix         & 0x1f );
  91.                             r += ( ( pix >>  5 ) & 0x1f );
  92.                             g += ( ( pix >> 10 ) & 0x1f );
  93.                             n++;
  94.                         }
  95.                     }
  96.                 }
  97.               // 平均値を計算
  98.                 if (n > 0)
  99.                 {
  100.                     b = ( b + (b % n ) ) / n;
  101.                     r = ( r + (r % n ) ) / n;
  102.                     g = ( g + (g % n ) ) / n;
  103.                 }
  104.               // 1ピクセルの計算結果をバッファに書き込む
  105.                 WORD( buffer+y*640+x*2 ) = b + (r << 5) + (g << 10);
  106.             }
  107.         }
  108.         return 0;
  109.     }
  110.  
  111. /*--------------------------------------------------------*/
  112. /*       pImageBuf の絵に、buffer の内容をかぶせる        */
  113. /*--------------------------------------------------------*/
  114.  
  115.     int mov_save_filter( int flt, char *buffer )
  116.     {
  117.         int x, y, flt1, flt2, flt3;
  118.         int filt[][19] = {
  119.             { -9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9 },
  120.             { -9,-8,-7,-6,-5,-4,-3,-2, 0,0,0,2,3,4,5,6,7,8,9 },
  121.             { -9,-8,-7,-6,-5,-4,-3,-1, 0,0,0,1,3,4,5,6,7,8,9 },
  122.             { -9,-8,-7,-6,-5,-4,-2,-1, 0,0,0,1,2,4,5,6,7,8,9 },
  123.             { -9,-8,-7,-6,-5,-4,-2, 0, 0,0,0,0,2,4,5,6,7,8,9 },
  124.             { -9,-8,-7,-5,-4,-2,-1, 0, 0,0,0,0,1,2,4,5,7,8,9 },
  125.         };
  126.         int f1[] = { 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5 };
  127.         int f2[] = { 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5 };
  128.         int f3[] = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5 };
  129.             /* フィルター */
  130.         if ( flt < 0 )
  131.             flt = 0;
  132.         if ( flt > 15 )
  133.             flt = 15;
  134.         flt1 = f1[ flt ];
  135.         flt2 = f2[ flt ];
  136.         flt3 = f3[ flt ];
  137.         if (flt > 0)
  138.         {
  139.             for (y=svar.y0; y<=svar.y1; y++)
  140.             {
  141.                 for (x=svar.x0; x<=svar.x1; x++)
  142.                 {
  143.                     int idx = y*640 + x*2;    /* buffer add */
  144.                     int px1,px2;
  145.                     int r1,g1,b1,r2,g2,b2;
  146.                     px1 = WORD( buffer+idx );
  147.                     px2 = WORD( pImageBuf+idx );
  148.                     GETRGB(px1,r1,g1,b1);
  149.                     GETRGB(px2,r2,g2,b2);
  150.                     if ((b2-b1 > -10) && (b2-b1 < 10) )
  151.                         b2 = b1 + filt[ flt1 ][b2-b1+9];
  152.                     if ((r2-r1 > -10) && (r2-r1 < 10) )
  153.                         r2 = r1 + filt[ flt2 ][r2-r1+9];
  154.                     if ((g2-g1 > -10) && (g2-g1 < 10) )
  155.                         g2 = g1 + filt[ flt3 ][g2-g1+9];
  156.                     WORD(pImageBuf+idx) = b2 + (r2 << 5) + (g2 << 10);
  157.                 }
  158.             }
  159.         }
  160.         return 0;
  161.     }
  162.  
  163. /*--------------------------------------------------------*/
  164. /*        pImageBuf の、指定範囲の外側をクリアする        */
  165. /*--------------------------------------------------------*/
  166.  
  167.     int mov_save_trim( cmpmode )
  168.     int cmpmode;
  169.     {
  170.         int color, x, y;
  171.         color = svar.b + (svar.r << 5) + (svar.g << 10);
  172.         int i;
  173.       // 最上位ビットをクリア
  174.         for (i=0; i<320*240*2; i+=4)
  175.             DWORD( rbuf+i ) &= 0x7fff7fff;
  176.         for (i=0; i<320*240*2; i+=4 )
  177.             DWORD( pImageBuf+i ) &= 0x7fff7fff;
  178.       // 範囲指定値の整合性チェック
  179.         if (svar.x0 > svar.x1)
  180.             INTSWAP(svar.x0, svar.x1);
  181.         if (svar.y0 > svar.y1)
  182.             INTSWAP(svar.y0, svar.y1);
  183.         if (svar.x0 == 0 && svar.y0 == 0 && svar.x1 == 319 && svar.y1 == 239)
  184.             return 0;
  185.       // 
  186.         for ( y=0 ; y < 240 ; y++ )
  187.         {
  188.             for ( x=0 ; x < 320 ; x++ )
  189.             {
  190.                 if (x < svar.x0 || svar.x1 < x || y < svar.y0 || svar.y1 < y)
  191.                 {
  192.                     int i = y*640 + x*2;    /* buffer add */
  193.                     if ( cmpmode != 0 )
  194.                     {
  195.                         WORD(rbuf     +i) |= 0x8000;
  196.                         WORD(pImageBuf+i) ^= (unsigned int)0xffff;
  197.                     }
  198.                     else
  199.                         WORD(pImageBuf+i) = color;
  200.                 }
  201.             }
  202.         }
  203.         return 0;
  204.     }
  205.  
  206.  
  207.     mov_save_end( namemov )
  208.     char *namemov;
  209.     {
  210.         FILE *fps;
  211.         int i, temp, data[2];
  212.  
  213.         if( svar.frame == 0 )
  214.             return 0;
  215.         for( i=0 ; i<6 ; i++ ){        /* disk write protect の場合6回必要 */ 
  216.             if( ( fps = fopen( namemov, "r+b" ) ) != NULL )goto save2;
  217.         }
  218.         return 2;
  219.     save2:
  220.         data[0] = svar.total_byte;
  221.         data[1] = svar.frame;            /* data長 page */
  222.         fseek( fps, 8, SEEK_SET );
  223.         temp = fwrite( (char *)data, 8, 1, fps );
  224.         fclose( fps );
  225.         if( temp < 1 ){
  226.         /*    remove( namemov );    error */
  227.             return 2;
  228.         }
  229.         return 0;
  230.     }
  231.  
  232. /*--------------------------------------------------------*/
  233. /*                圧縮処理のサブルーチン群                */
  234. /*--------------------------------------------------------*/
  235.  
  236. /* 平均化したデータをrbufに書き込む */
  237.  
  238.     int mov_save_stosw1_write( p )
  239.     int p;
  240.     {
  241.         int i, j, k, n, m, data, addre1, addre2, len;
  242.         int a1, a2, vadd;
  243.  
  244.         data = WORD( bbuf + p ) | 0x8000;
  245.         p += 2;
  246.         n = WORD( bbuf + p );
  247.         p += 2;
  248.         if( n ){
  249.             for( i=0 ; i<n ; i++ ){
  250.             addre1 = WORD( bbuf + p ) << 16;
  251.             p += 2;
  252.             m = WORD( bbuf + p );
  253.             p += 2;
  254.             if( m ){
  255.                 for( j=0 ; j<m ; j++ ){
  256.                 addre2 = addre1 + WORD( bbuf + p );
  257.                 p += 2;
  258.                 len = BYTE( bbuf + p );
  259.                 p += 1;
  260.                 if( len == 0xff ){
  261.                     len = WORD( bbuf + p );
  262.                     p += 2;
  263.                 }
  264.                 if( len == 0xffff ){
  265.                     len = DWORD( bbuf + p );
  266.                     p += 4;
  267.                 }
  268.                 if( len ){
  269.                     for( k=0 ; k<len ; k++ ){
  270.                     WORD( rbuf + addre2 + k*2 ) = data;
  271.                     }
  272.                 }
  273.                     /* 両端okなら処理済みに */
  274.                 k = addre2 - 2;
  275.                 if( k > 0 && k < 153600 ){
  276.                     vadd = ( (k/640) << 10 ) + ( k % 640 );
  277.                     a1 = WORD(pImageBuf + k);
  278.                     a2 = WORD(rbuf      + k);
  279.                     if (mov_save_cmp_data(a1, a2, svar.rough) == 0
  280.                         && (a2 & 0x8000) == 0 )
  281.                     {
  282.                         WORD(rbuf      + k) = a2 | 0x8000;
  283.                         WORD(pImageBuf + k) ^= 0xffff;
  284.                     }
  285.                 }
  286.                 k = addre2 + len*2;
  287.                 if( k > 0 && k < 153600 ){
  288.                     vadd = ( (k/640) << 10 ) + ( k % 640 );
  289.                     a1 = WORD(pImageBuf+k);
  290.                     a2 = WORD( rbuf+k );
  291.                     if( mov_save_cmp_data( a1, a2, svar.rough ) == 0 
  292.                      && (a2 & 0x8000) == 0 ){
  293.                     WORD( rbuf+k ) = a2 | 0x8000;
  294.                     WORD(pImageBuf+k) ^= 0xffff;
  295.                     }
  296.                 }
  297.                 }
  298.             }
  299.             }
  300.         }
  301.         return 0;
  302.     }
  303.  
  304. /* store 最初にdataを読み込むtype & data平均化付き(1992 1.17) */
  305.  
  306.     int mov_save_stosw1( i )
  307.     int i;
  308.     {
  309.         int p1, p2, p3, p4, p5, p6;
  310.         int j, j1, j2, j3;
  311.         int k, k1;
  312.         int data;
  313.         int a1, a2;
  314.         int n1, n2, n3;
  315.         int bt, rt, gt, nt, dt;        /* data 平均値用 変数 */
  316.  
  317.         WORD( bbuf+i ) = 0x1222; i+=2;    /* stosw brock */
  318.         p1 = i; i+=4;            /* size point */
  319.         p2 = i; i+=2;            /* data count point */
  320.         n1 = 0;                /* data count */
  321.         for( j1=0 ; j1<153600 ; j1+=2 ){
  322.             if( WORD( rbuf+j1 ) & 0x8000 )goto stos03;    /* 処理済skip */
  323.             data = WORD(pImageBuf+j1);
  324.             if(
  325.               mov_save_skip_check6( data, j1 )
  326.             )goto stos03;        /* skip check */
  327.             bt = 0; rt = 0; gt = 0; nt = 0;        /* for data 平均 */
  328.             p3 = i;            /* data top point */
  329.             WORD( bbuf+i ) = data; i+=2;    /* data */
  330.             p4 = i; i+=2;        /* offset count point */
  331.             n2 = 0;            /* offset count */
  332.             for( j2=0 ; j2<3 ; j2++ ){ /* offset loop */
  333.             p5 = i;            /* offset top point */
  334.             WORD( bbuf+i ) = j2; i+=2;    /* offset */
  335.             p6 = i; i+=2;        /* d-address count point */
  336.             n3 = 0;            /* d-address count */
  337.             k = 0; k1 = 0;        /* data長count係数 */
  338.             for( j3=0x10000*j2 ; j3<0x10000*(j2+1) ; j3+=2 ){
  339.                 if( j3 >= 153600 )break;
  340.                 a2 = WORD( rbuf+j3 );
  341.                 if( a2 & 0x8000 ){            /* 処理済skip */
  342.                 if( k ){
  343.                     i = i + k1;
  344.                     k = 0; k1 = 0;
  345.                 }
  346.                 goto stos01;
  347.                 }
  348.                 j = ( (j3/640) << 10 ) + ( j3 % 640 );
  349.                 a1 = WORD(pImageBuf+j3);
  350.                 if( (a2 & 0x8000) == 0         /* 手つかず */
  351.                     && mov_save_cmp_data( data, a1, svar.rough ) == 0 
  352.                                     /* 同色と認め */ 
  353.                 ){
  354.                 if( k == 0 )if( 
  355.                   mov_save_skip_check4(data,j3)
  356.                 )goto stos01;
  357.                 k++;
  358.  
  359.                     /* for data 平均 */
  360.                 bt = bt + ( a1 & 0x1f );
  361.                 rt = rt + ( (a1 >> 5) & 0x1f );
  362.                 gt = gt + ( (a1 >> 10) & 0x1f );
  363.                 nt++;
  364.  
  365.                 WORD( rbuf+j3 ) = 0x8000 | data;    /* 処理印 */
  366.                 WORD(pImageBuf+j3) ^= 0xffff;
  367.                 if( k == 1 ){
  368.                     n3++;
  369.                     WORD( bbuf+i ) = ( j3 & 0xffff );
  370.                 }
  371.                 if( k<0xff ){
  372.                     BYTE( bbuf+i+2 ) = k;
  373.                     k1 = 1+2;
  374.                 }
  375.                 if( (k>=0xff) && (k<0xffff) ){
  376.                     BYTE( bbuf+i+2 ) = 0xff;
  377.                     WORD( bbuf+i+3 ) = k;
  378.                     k1 = 3+2;
  379.                 }
  380.                 if( k>=0xffff ){
  381.                     BYTE( bbuf+i+2 ) = 0xff;
  382.                     WORD( bbuf+i+3 ) = 0xffff;
  383.                     DWORD( bbuf+i+5 ) = k;
  384.                     k1 = 7+2;
  385.                 }
  386.                 }
  387.                 else {
  388.                 if( k ){
  389.                     i = i + k1;
  390.                     k = 0; k1 = 0;
  391.                 }
  392.                 }
  393.             stos01: ;
  394.             }
  395.         stos02:    i = i + k1;
  396.             WORD( bbuf+p6 ) = n3;
  397.             if( n3 )n2++;
  398.             else i = p5;
  399.             }
  400.             WORD( bbuf+p4 ) = n2;
  401.             if( n2 ){
  402.             n1++;
  403.  
  404.             if( nt ){    /* for data 平均 */
  405.                 dt =  ( (bt + bt % nt) / nt )
  406.                   + ( ( (rt + rt % nt) / nt ) << 5 )
  407.                   + ( ( (gt + gt % nt) / nt ) << 10 );
  408.                 WORD( bbuf + p3 ) = dt;
  409.                 mov_save_stosw1_write( p3 );
  410.             }
  411.  
  412.             }
  413.             else i = p3;
  414.         stos03: ;
  415.         }
  416.         WORD( bbuf+p2 ) = n1;
  417.         if( n1 == 0 )i = p2;
  418.         DWORD( bbuf+p1 ) = i - p2;
  419.         return i;
  420.     }
  421.  
  422.     int mov_save_skip_check2( data, n )
  423.     int data, n;
  424.     {            /* 4つdataと同じ色が続くもの以外はスキップ */
  425.         int a, b, i, j, k;
  426.  
  427.         if( n > 153588 )return 1;
  428.         if( WORD( rbuf+n ) & 0x8000 )return 1;
  429.         for( i=0 ; i<4 ; i++ ){
  430.             k = n + (i << 1);
  431.             a = WORD(pImageBuf+k);
  432.             b = WORD( rbuf + k );
  433.             if( mov_save_cmp_data( data, a, svar.rough) )return 1;
  434.         }
  435.         return 0;
  436.     }
  437.  
  438. /* skip_check1 = 1:skip ( for stosw ) */
  439.  
  440.     int mov_save_skip_check4( data, n )
  441.     int data, n;
  442.     {            /* 4つdataと同じ色が続くもの以外はスキップ */
  443.         int a, b, i, j, k;
  444.  
  445.         if( n > 153588 )return 1;    /* ↓処理済直後はok */
  446.         if( n && ( (DWORD( rbuf+n-2 ) & 0x80008000) == 0x8000 ) )return 0;
  447.         if( WORD( rbuf+n ) & 0x8000 )return 1;
  448.         for( i=0 ; i<4 ; i++ ){
  449.             k = n + (i << 1);
  450.             j = ( (k/640) << 10 ) + ( k % 640 );
  451.             a = WORD(pImageBuf+k);
  452.             b = WORD( rbuf + k );
  453.             if( b & 0x8000 )return 0;
  454.             if( mov_save_cmp_data( data, a, svar.rough) )return 1;
  455.         }
  456.         return 0;
  457.     }
  458.  
  459.     int mov_save_skip_check6( data, n )
  460.     int data, n;
  461.     {            /* 6つdataと同じ色が続くもの以外はスキップ */
  462.         int a, b, i, j, k;
  463.  
  464.         if( n > 153588 )return 1;
  465.         if( DWORD( rbuf+n ) & 0x80008000 )return 1;
  466.         if( DWORD( rbuf+n+4 ) & 0x80008000 )return 1;
  467.         if( DWORD( rbuf+n+8 ) & 0x80008000 )return 1;
  468.         for( i=0 ; i<6 ; i++ ){
  469.             k = n + (i << 1);
  470.             j = ( (k/640) << 10 ) + ( k % 640 );
  471.             a = WORD(pImageBuf+k);
  472.             b = WORD( rbuf + k );
  473.             if( mov_save_cmp_data( data, a, svar.rough) )return 1;
  474.         }
  475.         return 0;
  476.     }
  477.  
  478. /* movsw */
  479.  
  480.     int mov_save_movsw( i )
  481.     int i;
  482.     {
  483.         int p1, p4, p5, p6;
  484.         int j, j2, j3, j4;
  485.         int k, k1, k2;
  486.         int a1, a2;
  487.         int n2, n3;
  488.  
  489.         WORD( bbuf+i ) = 0x2222; i+=2;    /* movsw brock */
  490.         p1 = i; i+=4;            /* size point */
  491.         p4 = i; i+=2;        /* offset count point */
  492.         n2 = 0;            /* offset count */
  493.         for( j2=0 ; j2<3 ; j2++ ){ /* offset loop */
  494.             p5 = i;            /* offset top point */
  495.             WORD( bbuf+i ) = j2; i+=2;    /* offset */
  496.             p6 = i; i+=2;        /* d-address count point */
  497.             n3 = 0;            /* d-address count */
  498.             k = 0; k1 = 0;        /* data長count係数 */
  499.             for( j3=0x10000*j2 ; j3<0x10000*(j2+1) ; j3+=2 ){
  500.             if( j3 >= 153600 )break;
  501.             j = ( (j3/640) << 10 ) + ( j3 % 640 );        /* vram add */
  502.             a1 = WORD(pImageBuf+j3); a2 = WORD( rbuf+j3 );
  503.             if( (a2 & 0x8000) == 0 ){
  504.                 k++;
  505.                 WORD( rbuf+j3 ) = 0x8000 | a1;        /* 処理印 */
  506.                 WORD(pImageBuf+j3) ^= 0xffff;
  507.                 if( k == 1 ){
  508.                 n3++;
  509.                 k2 = j3;            /* address記憶 */
  510.                 WORD( bbuf+i ) = ( j3 & 0xffff );
  511.                 }
  512.                 if( k<0xff ){
  513.                 BYTE( bbuf+i+2 ) = k;
  514.                 k1 = 1+2;
  515.                 }
  516.                 if( (k>=0xff) && (k<0xffff) ){
  517.                 BYTE( bbuf+i+2 ) = 0xff;
  518.                 WORD( bbuf+i+3 ) = k;
  519.                 k1 = 3+2;
  520.                 }
  521.                 if( k>=0xffff ){
  522.                 BYTE( bbuf+i+2 ) = 0xff;
  523.                 WORD( bbuf+i+3 ) = 0xffff;
  524.                 DWORD( bbuf+i+5 ) = k;
  525.                 k1 = 7+2;
  526.                 }
  527.             }
  528.             else {
  529.                 if( k ){
  530.                 i = i + k1;
  531.                 k = 0; k1 = 0;
  532.                 for( j4=k2 ; j4<j3 ; j4+=2 ){ /* data write */
  533.                     WORD( bbuf+i ) = WORD( rbuf+j4 ) & 0x7fff;
  534.                     i+=2;
  535.                 }
  536.                 }
  537.             }
  538.         movs01: ;
  539.             }
  540.         movs02: if( k ){
  541.             i = i + k1;
  542.             k = 0; k1 = 0;
  543.             for( j4=k2 ; j4<j3 ; j4+=2 ){ /* data write */
  544.                 WORD( bbuf+i ) = WORD( rbuf+j4 ) & 0x7fff;
  545.                 i+=2;
  546.             }
  547.             }
  548.             WORD( bbuf+p6 ) = n3;
  549.             if( n3 )n2++;
  550.             else i = p5;
  551.         }
  552.         WORD( bbuf+p4 ) = n2;
  553.         if( n2 == 0 )i = p4;
  554.         DWORD( bbuf+p1 ) = i - p4;
  555.         return i;
  556.     }
  557.  
  558. /* move box ( 16*16dot )指定されたboxを転送 */
  559.  
  560.     int mov_save_movebox16( i )
  561.     int i;
  562.     {
  563.         int p1, p2, n;
  564.         int j, j2, j3;
  565.         int xmin, xmax, ymin, ymax, x, y, x1, y1, x2, y2, kx, ky, d;
  566.         int max, a, a1, a2, b, r, g, cr, cb, yu, temp, temp2;
  567.         int bfaddr, rbaddr, vraddr;
  568.         char *offset1, *offset2;
  569.         char vyuv[1024];        /* vram YUV data */
  570.  
  571.         offset1 = bbuf+0x1000;    /* 旧画面データをchar *offset1にもう1枚作る */
  572.         for( j=0 ; j<153600 ; j+=4 )DWORD( offset1+j ) = DWORD( rbuf+j );
  573.         offset2 = bbuf+0x30000;    /* 旧画面データのYUV data */
  574.             /* rgb data (offset1) を yuv data (offset2) に */
  575.         for( j=0 ; j<76800 ; j++ ){
  576.             a = WORD( offset1 + (j << 1) );
  577.             b = a & 0x1f;
  578.             r = (a >> 5) & 0x1f;
  579.             g = (a >> 10) & 0x1f;
  580.                 /* G,R,BをY,Cr,Cbに変換 */
  581.             cr = -107*g + 128*r - 21*b + 3968;    /* 0~256*31 */
  582.             cb = -85*g - 43*r + 128*b + 3968;
  583.             yu = ( 150*g + 77*r + 37*b ) >> 4;
  584.                 /* Cr(8), Cb(8), Y(16) */
  585.             DWORD( offset2 +(j << 2) )
  586.              = (cr >> 5) + ((cb << 3)& 0x0ff00) + (yu << 16);
  587.         }
  588.  
  589.         WORD( bbuf+i ) = 0x3010; i+=2;    /* move box 16 */
  590.         p1 = i; i+=4;            /* size point */
  591.         p2 = i; i+=2;        /* data 個数 count point */
  592.         n = 0;            /* data 個数 count */
  593.             /* trimming area を はずすためのもの */
  594.         xmin = 16*( svar.x0/16 ); if( svar.x0%16 )xmin += 16;
  595.         xmax = 16*( svar.x1/16 ); if( svar.x1%16 == 15 )xmax += 1;
  596.         ymin = 16*( svar.y0/16 ); if( svar.y0%16 )ymin += 16;
  597.         ymax = 16*( svar.y1/16 ); if( svar.y1%16 == 15 )ymax += 1;
  598.         for( y=ymin ; y<ymax ; y+=16 ){
  599.             for( x=xmin ; x<xmax ; x+=16 ){
  600.                 /* vram YUV */
  601.             vraddr = y*1024 + x*2;     /* vram address */
  602.             j = 0;            /* count vyuv */
  603.             for( j2=0 ; j2<16 ; j2++ ){
  604.                 for( j3=0 ; j3<32 ; j3+=2 ){
  605.                 a = WORD(pImageBuf+(y+j2)*640+x*2+j3);
  606.                 b = a & 0x1f;
  607.                 r = (a >> 5) & 0x1f;
  608.                 g = (a >> 10) & 0x1f;
  609.                     /* G,R,BをY,Cr,Cbに変換 */
  610.                 cr = -107*g + 128*r - 21*b + 3968;    /* 0~256*31 */
  611.                 cb = -85*g - 43*r + 128*b + 3968;
  612.                 yu = ( 150*g + 77*r + 37*b ) >> 4;
  613.                     /* Cr(8), Cb(8), Y(16) */
  614.                 DWORD( vyuv +j )
  615.                  = (cr >> 5) + ((cb << 3) & 0x0ff00) + (yu << 16);
  616.                 j+=4;
  617.                 }
  618.                 vraddr += 1024;
  619.             }
  620.             temp2 = mov_save_cmp_box16( offset2, x, y, vyuv, svar.rough );
  621.             if( temp2 > 255-8 )  { goto mov02; }
  622.             max = temp2;
  623.             kx = x; ky = y;
  624.                 /* ずらして調べる */
  625.             x1 = x; y1 = y;
  626.             for( d=svar.premove ; d>0 ; d-- ){
  627.               for( j2 = -1 ; j2 <= 1 ; j2++ ){
  628.                  for( j3 = -1 ; j3 <= 1 ; j3++ ){
  629.                 x2 = x1 + j3*d;
  630.                 y2 = y1 + j2*d;
  631.                 if( x2 < 0 )x2 = 0;    /* はみ出しを切る */
  632.                 if( x2 > 304 )x2 = 304;
  633.                 if( y2 < 0 )y2 = 0;
  634.                 if( y2 > 224 )y2 = 224;
  635.                 temp
  636.                 = mov_save_cmp_box16(
  637.                  offset2, x2, y2, vyuv, svar.rough );
  638.                 if( temp > max ){
  639.                     max = temp;
  640.                     kx = x2; ky = y2;
  641.                 }
  642.                  }
  643.               }
  644.               x1 = kx; y1 = ky;
  645.             }
  646.                 /* 大まかに調べる */
  647.             x1 = x - 32; if( x1 < 0 )x1 = 0;
  648.             x2 = x + 32; if( x2 > 304 )x2 = 304;
  649.             y1 = y - 32; if( y1 < 0 )y1 = 0;
  650.             y2 = y + 32; if( y2 > 224 )y2 = 224;
  651.             for( j2 = x1 ; j2 <= x2 ; j2+=16 ){
  652.                 for( j3 = y1 ; j3 <= y2 ; j3+=16 ){
  653.                 temp
  654.                 = mov_save_cmp_box16( offset2, j2, j3, vyuv, svar.rough );
  655.                 if( temp > max ){
  656.                     max = temp;
  657.                     kx = j2; ky = j3;
  658.                 }
  659.                 }
  660.             }
  661.             if( max > temp2+8 ){
  662.                 DWORD( bbuf+i ) = y*640 + x*2; i+=4;
  663.                 WORD( bbuf+i ) = kx; i+=2;
  664.                 WORD( bbuf+i ) = ky; i+=2;
  665.                 n++;
  666.                 bfaddr = ky*640 + kx*2;     /* offset1 相対 address */
  667.                 rbaddr = y*640 + x*2;     /* rbuf 相対 address */
  668.                 vraddr = y*1024 + x*2;     /* vram address */
  669.                 for( j2=0 ; j2<16 ; j2++ ){
  670.                 for( j3=0 ; j3<32 ; j3+=2 ){
  671.                     a1 = WORD(pImageBuf+(y+j2)*640+x*2+j3);
  672.                     a2 = WORD( offset1+bfaddr+j3 ) & 0x7fff;
  673.                     WORD( rbuf+rbaddr+j3 ) = a2;
  674.                     if( mov_save_cmp_data( a1, a2, svar.rough ) == 0 
  675.                     && (a1 & 0x8000) == 0 ){
  676.                     WORD( rbuf+rbaddr+j3 ) = a2 | 0x8000;
  677.                     WORD(pImageBuf+(y+j2)*640+x*2+j3) ^= 0xffff;
  678.                     }
  679.                 }
  680.                 bfaddr+=640; rbaddr+=640; vraddr+=1024;
  681.                 }
  682.             mov02:  ;
  683.             }
  684.             }
  685.         }
  686.         WORD( bbuf+p2 ) = n;
  687.         if( n == 0 )i = p2;
  688.         DWORD( bbuf+p1 ) = i - p2;
  689.         return i;
  690.     }
  691.  
  692. /* YUV data buffer の char buffer(320*240)[開始座標(x,y)]と
  693. char *vyuv(16*16)の中でYUV判定で同じものを数える */
  694.  
  695.     int mov_save_cmp_box16( buffer, x, y, vyuv, rate )
  696.     char *buffer, *vyuv;
  697.     int x, y, rate;
  698.     {
  699.         int d1, d2, i, j, n, rate2;
  700.  
  701.         buffer = buffer + 1280*y + 4*x;
  702.         n = 0; rate2 = rate*rate;
  703.         for( j=0 ; j<16 ; j++ ){
  704.             for( i=0 ; i<64 ; i+=4 ){
  705.                 d1 = (WORD( buffer+i+2 ) - WORD( vyuv+2 ));
  706.                 if( d1 > rate )goto cmp01;
  707.                 if( d1 < -rate )goto cmp01;
  708.                 d1 = BYTE( buffer+i ) - BYTE( vyuv );
  709.                 d2 = BYTE( buffer+i+1 ) - BYTE( vyuv+1 );
  710.                 if( d1*d1 + d2*d2 <= rate2 )n++;
  711.             cmp01:  vyuv += 4;
  712.             }
  713.             buffer += 1280;
  714.         }
  715.         return n;
  716.     }
  717.  
  718. /* Y,Cr,CbによるCOLCOR DATA比較法 91 7 24 */
  719.  
  720.     int mov_save_cmp_data( a, b, rate )
  721.     int a, b, rate;
  722.     {
  723.         int b1,r1,g1, b2,r2,g2, d1, d2;
  724.  
  725.         if( (a & 0x7fff) == (b & 0x7fff) )return 0; /* 明白なものは処理 */
  726.         else if( rate == 0 )return 1;
  727.             /* G,R,B算出 */
  728.         b1 = a & 0x1f; b2 = b & 0x1f;
  729.         r1 = (a >> 5) & 0x1f; r2 = (b >> 5) & 0x1f;
  730.         g1 = (a >> 10) & 0x1f; g2 = (b >> 10) & 0x1f;
  731.             /* G,R,BをY,Cr,Cbに変換 & 判定 */
  732.         d1 = ( 150*(g2 - g1) + 77*(r2 - r1) + 37*(b2 - b1) ) >> 4;
  733.         if( d1 > rate )return 1;
  734.         if( d1 < -rate )return 1;
  735.         d1 = ( -107*(g2-g1) + 128*(r2-r1) - 21*(b2-b1) ) >> 5;
  736.         d2 = ( -85*(g2 -g1) - 43*(r2 -r1) + 128*(b2 -b1) ) >> 5;
  737.         if( d1*d1 + d2*d2 > rate*rate )return 1;
  738.         else return 0;
  739.     }
  740.  
  741. /*--------------------------------------------------------*/
  742. /*                      圧縮の心臓部                      */
  743. /*--------------------------------------------------------*/
  744.  
  745.     int mov_save_page( char *pszMovName )
  746.     {
  747.         static int softAdjust[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15};
  748.         static int filtAdjust[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15};
  749.  
  750.         int x,y;
  751.         int cmpmode;
  752.         FILE *fps;
  753.         // int i, j, k, n, x, y, data, temp;
  754.         // int xmin, ymin, xmax, ymax;
  755.         // int a1, a2;
  756.         int scount1;
  757.         //, cmpmode ;
  758.         // char para[64] ;
  759.         char hread[256];    /* for head read */
  760.         //     /* mov head */
  761.         char MovHead[256]; 
  762.         static int MovHeadInit[] = { 0x32564f4d, 16, 0, 0, 320, 240, 640 };
  763.         int pghead[8];
  764.  
  765.       // x0 < x1,  y0 < y1 になるようにチェック
  766.         if ( svar.x0 > svar.x1 )
  767.             INTSWAP(svar.x0, svar.x1);
  768.         if ( svar.y0 > svar.y1 )
  769.             INTSWAP(svar.y0, svar.y1);
  770.       // 前の絵と同じ点をカウント
  771.         scount1 = 0;
  772.         for ( y = svar.y0 ; y <= svar.y1 ; y++ )
  773.         {
  774.             for( x = svar.x0 ; x <= svar.x1 ; x++ )
  775.             {
  776.                 int i = y*640 + x*2;
  777.                 if (mov_save_cmp_data(WORD(rbuf+i),WORD(pImageBuf+i),
  778.                                       svar.rough) == 0)
  779.                     scount1++; 
  780.             }
  781.         }
  782.         cmpmode = ((scount1 < (scount0 >> 1)) ? 0 : 1);
  783.         scount0 = scount1;
  784.       // ソフトネスをかける
  785.         if ( svar.soft > 0 )
  786.         {
  787.             mov_save_soft( bbuf );
  788.             mov_save_filter( softAdjust[ svar.soft ], bbuf );
  789.         }
  790.  
  791.       // ヘッダを出力
  792.         if ( svar.frame == 0 )
  793.         {
  794.             svar.frame = 0;
  795.             svar.total_byte = 0;
  796.             cmpmode = 0;
  797.             scount0 = (svar.x1-svar.x0+1) * (svar.y1-svar.y0+1) / 8;
  798.                 /* 次回から1/16以上同じなら差分 */
  799.             int k;
  800.             for( k=0 ; k<256 ; k++ )
  801.                 MovHead[k] = (char)0;
  802.             for( k=0 ; k<7 ; k++ )
  803.                 DWORD( MovHead+k*4 ) = MovHeadInit[k];
  804.             DWORD(MovHead + 28 ) = svar.wait;
  805.             WORD( MovHead + 32 ) = svar.x0;
  806.             WORD( MovHead + 34 ) = svar.y0;
  807.             WORD( MovHead + 36 ) = svar.x1;
  808.             WORD( MovHead + 38 ) = svar.y1;
  809.             MovHead[150] = (char)1;    /* タイミングフラグを表示してウエイト */
  810.             if ((fps=fopen(pszMovName, "wb")) == NULL)
  811.                 return 2;
  812.             fwrite( MovHead, 256, 1, fps );
  813.             fclose( fps );
  814.         }
  815.       // 画面のはみ出した部分をclear
  816.         mov_save_trim( cmpmode );        /* trimming */
  817.       // リフレッシュ
  818.         int temp; // エラーコード
  819.         if ( cmpmode == 0 )
  820.         {
  821.             int k;
  822.           // 最多色検索
  823.             for (k=0; k<32768; k++)
  824.                 DWORD( rbuf+k*4 ) = 0;
  825.             for (k=0; k<320*240; k++)
  826.             {
  827.                 int data = WORD(pImageBuf+k*2);
  828.                 DWORD(rbuf+data*4) += 1;
  829.             }
  830.             int cnt;    // 色の出現数
  831.             int nCol;    // もっともよく現れる色
  832.             cnt = 0;
  833.             nCol = 0;
  834.             for( k=0 ; k<32768 ; k++ )
  835.                 if ( DWORD(rbuf+k*4) > cnt )
  836.                     cnt = DWORD(rbuf+k*4), nCol = k;
  837.           // 塗りつぶし
  838.             for (k=0; k<320*240*2; k+=2)
  839.             {
  840.                 WORD(rbuf+k) = nCol;
  841.                 if (mov_save_cmp_data(nCol,WORD(pImageBuf+k),svar.rough) == 0)
  842.                 {
  843.                     WORD(rbuf+k) = nCol | 0x8000;    /* 処理印 */
  844.                     WORD(pImageBuf+k) ^= (unsigned int)0xffff;
  845.                 }
  846.             }
  847.           // 孤立した点は処理解除
  848.             for( k=2 ; k<153598 ; k+=2 )
  849.             {
  850.                 if( (DWORD( rbuf+k ) & 0x80008000) == 0x8000
  851.                     && (WORD( rbuf+k-2 ) & 0x8000) == 0 )
  852.                 {
  853.                     WORD( rbuf+k ) &= 0x7fff;
  854.                     WORD(pImageBuf+k) ^= 0xffff;
  855.                 }
  856.             }
  857.           // ページヘッダの作成
  858.             int i;
  859.             WORD(bbuf    ) = 3;            /* brock 数 */
  860.             WORD(bbuf+2  ) = 0x1422;    /* stosd brock */
  861.             DWORD(bbuf+4 ) = 17;        /* data size */
  862.             WORD(bbuf+8  ) = 1;            /* data 数 */
  863.             DWORD(bbuf+10) = nCol + ( nCol << 16 ); /* data */
  864.             WORD(bbuf+14 ) = 1;            /* offset 数 */
  865.             WORD(bbuf+16 ) = 0x0000;     /* offset */
  866.             WORD(bbuf+18 ) = 1;            /* data 個数 */
  867.             WORD(bbuf+20 ) = 0x0000;    /* 下位 address */
  868.             BYTE(bbuf+22 ) = 0xff;        /* 長さ */
  869.             WORD(bbuf+23 ) = 38400;
  870.             i = 25;
  871.             i = mov_save_stosw1( i );        /* stosw */
  872.           // 再びくっついてる点は復活
  873.             for( k=2 ; k<153598 ; k+=2 ){
  874.                 if( (DWORD( rbuf+k ) & 0x80008000) == 0x80000000
  875.                     || (DWORD( rbuf+k-2 ) & 0x80008000) == 0x8000 )
  876.                 {
  877.                     int a1,a2;
  878.                     a1 = WORD(pImageBuf+k);
  879.                     a2 = WORD(rbuf     +k);
  880.                     if (mov_save_cmp_data(a1,a2,svar.rough) == 0 
  881.                         && (a2 & 0x8000) == 0 )
  882.                     {
  883.                         WORD( rbuf+k ) = a2 | 0x8000;    /* 処理印 */
  884.                         WORD( pImageBuf+k ) ^= 0xffff;
  885.                     }
  886.                 }
  887.             }
  888.           // 
  889.             i = mov_save_movsw( i );        /* movsw */
  890.             pghead[0] = svar.frame;        /* page page head */
  891.             pghead[1] = i;            /* dsize */
  892.             pghead[2] = 0;            /* ox,oy */
  893.             pghead[3] = 0;            /* wait & loop */
  894.             pghead[4] = 0;            /* リザーブ */
  895.             pghead[5] = 0;            /* sound data1 */
  896.             pghead[6] = 0;            /* sound data2 */
  897.             pghead[7] = 0;            /* sound data3 */
  898.             if((fps=fopen( pszMovName, "r+b" )) == NULL )
  899.                 return 2;
  900.             fread( hread, 256, 1, fps );
  901.             fseek( fps, 256+DWORD(hread+8), SEEK_SET );
  902.             fwrite( (char *)pghead, 32, 1, fps );
  903.             fwrite( bbuf, i, 1, fps );
  904.             temp = ferror( fps );
  905.             fclose( fps );
  906.             svar.total_byte += (i + 32);
  907.         }
  908.         else
  909.         {
  910.         /* 差分 */
  911.             int i;
  912.             i = 0;                /* data counter */
  913.             WORD( bbuf+i ) = 2;
  914.             if( svar.premove )
  915.                 WORD( bbuf+i ) += 1;
  916.             i+=2;
  917.             if( svar.premove )
  918.             {
  919.                 i = mov_save_movebox16( i );
  920.                     /* clearしてやり直す */
  921.                 for( y=svar.y0 ; y<=svar.y1 ; y++ ){
  922.                     for( x=svar.x0 ; x<=svar.x1 ; x++ ){
  923.                         // j = (y << 10) + (x << 1);    /* vram */
  924.                         int k;
  925.                         int a1,a2;
  926.                         k = y*640 + x*2;        /* rbuf */
  927.                         a1 = WORD(pImageBuf+k);
  928.                         a2 = WORD(rbuf     +k);
  929.                         if( a1 & 0x8000 )
  930.                             WORD(pImageBuf + k) ^= 0xffff;
  931.                         if( a2 & 0x8000 )
  932.                             WORD( rbuf+k ) = a2 & 0x7fff;
  933.                     }
  934.                 }
  935.             }
  936.           /* フィルター */
  937.             //    if( svar[11] )mov_save_filter2( filtAdjust[ svar[11] ], svar, rbuf );
  938.                 /* check */
  939.             for( y=svar.y0 ; y<=svar.y1 ; y++ ){
  940.                 for( x=svar.x0 ; x<=svar.x1 ; x++ ){
  941.                     int k,a1,a2;
  942.                     // j = (y << 10) + (x << 1);    /* vram */
  943.                     k = y*640 + x*2;        /* rbuf */
  944.                     a1 = WORD(pImageBuf+k);
  945.                     a2 = WORD( rbuf+k );
  946.                     if( mov_save_cmp_data( a1, a2, svar.rough ) == 0 
  947.                      && (a2 & 0x8000) == 0 ){
  948.                         WORD( rbuf+k ) = a2 | 0x8000;    /* 処理印 */
  949.                         WORD(pImageBuf+k) ^= 0xffff;
  950.                     }
  951.                 }
  952.             }
  953.                     /* 孤立した点は処理解除 */
  954.             int k;
  955.             for( k=2 ; k<153598 ; k+=2 ){
  956.                 if( (DWORD( rbuf+k ) & 0x80008000) == 0x8000
  957.                 && (WORD( rbuf+k-2 ) & 0x8000) == 0 ){
  958.                     WORD( rbuf+k ) &= 0x7fff;
  959.                     // j = ( (k/640) << 10 ) + ( k % 640 );
  960.                     WORD(pImageBuf+k) ^= 0xffff;
  961.                 }
  962.             }
  963.  
  964.             i = mov_save_stosw1( i );        /* stosw */
  965.  
  966.                     /* 再びくっついてる点は復活 */
  967.             for( k=2 ; k<153598 ; k+=2 ){
  968.                 if( (DWORD( rbuf+k ) & 0x80008000) == 0x80000000
  969.                 || (DWORD( rbuf+k-2 ) & 0x80008000) == 0x8000 ){
  970.                     // j = ( (k/640) << 10 ) + ( k % 640 );
  971.                     int a1,a2;
  972.                     a1 = WORD(pImageBuf+k);
  973.                     a2 = WORD( rbuf+k );
  974.                     if( mov_save_cmp_data( a1, a2, svar.rough ) == 0 
  975.                         && (a2 & 0x8000) == 0 ){
  976.                         WORD( rbuf+k ) = a2 | 0x8000;    /* 処理印 */
  977.                         WORD(pImageBuf+k) ^= 0xffff;
  978.                     }
  979.                 }
  980.             }
  981.  
  982.             i = mov_save_movsw( i );        /* movsw */
  983.             pghead[0] = svar.frame;        /* page page head */
  984.             pghead[1] = i;            /* dsize */
  985.             pghead[2] = 0;            /* ox,oy */
  986.             pghead[3] = 0;            /* wait & loop */
  987.             pghead[4] = 0;            /* リザーブ */
  988.             pghead[5] = 0;            /* sound data1 */
  989.             pghead[6] = 0;            /* sound data2 */
  990.             pghead[7] = 0;            /* sound data3 */
  991.             if( ( fps = fopen( pszMovName, "r+b" ) ) == NULL )
  992.                 return 2;
  993.             fread( hread, 256, 1, fps );
  994.             fseek( fps, 256+DWORD(hread+8), SEEK_SET );
  995.             fwrite( (char *)pghead, 32, 1, fps );
  996.             fwrite( bbuf, i, 1, fps );
  997.             temp = ferror( fps );
  998.             fclose( fps );
  999.             svar.total_byte += i + 32;
  1000.         }
  1001.  
  1002.         svar.frame++;
  1003.         if( temp ){
  1004.             /*    remove( namemov );    disk full */
  1005.             return 2;
  1006.         }
  1007.         return mov_save_end( pszMovName );
  1008.     }
  1009.  
  1010. /*--------------------------------------------------------*/
  1011. /*          MOVヘッダの読み込み(追加保存のため)           */
  1012. /*--------------------------------------------------------*/
  1013.  
  1014.     int mov_head_read(char *pszMovName)
  1015.     {
  1016.         FILE *fp;
  1017.         int n, temp, page, size;
  1018.         char head[256];
  1019.  
  1020.         if ((fp = fopen( pszMovName, "rb")) == NULL)
  1021.             return 1;
  1022.         temp = fread( head, 256, 1, fp );
  1023.         if (temp < 1)
  1024.             goto movh10;
  1025.       // MOVヘッダであるかどうか確認
  1026.         if (DWORD(head+0 ) != 0x32564f4d )
  1027.             goto movh10;
  1028.         if (DWORD(head+4 ) != 16 )
  1029.             goto movh10;
  1030.         if (DWORD(head+16) != 320 )
  1031.             goto movh10;
  1032.         if (DWORD(head+20) != 240 )
  1033.             goto movh10;
  1034.         svar.frame      = DWORD( head+12 );
  1035.         svar.total_byte = DWORD( head+ 8 );
  1036.         svar.x0 = WORD( head + 32 );            /* 録画領域 */
  1037.         svar.y0 = WORD( head + 34 );
  1038.         svar.x1 = WORD( head + 36 );
  1039.         svar.y1 = WORD( head + 38 );
  1040.         fclose( fp );
  1041.         return 0;
  1042.     movh10:
  1043.         fclose( fp );
  1044.         return 58;
  1045.     }
  1046.  
  1047. /*--------------------------------------------------------*/
  1048. /*                   MOVファイルの作成                    */
  1049. /*--------------------------------------------------------*/
  1050.  
  1051.     int mov_save( char *pszMovName, int nTotalFrame,
  1052.                    int (*pfnLoadFrame)(char*,int,int*,int*),
  1053.                    int (*pfnCheckFrame)(int),
  1054.                    MOVPARA *para)
  1055.     // 返り値:-2 メモリ不足
  1056.     {
  1057.         int err;
  1058.         err = 0;
  1059.       // 画像読み込みバッファを確保
  1060.         if ((pImageBuf = MALLOC(320*240*2)) == NULL)
  1061.             return -2;
  1062.         if ((rbuf = MALLOC(153600)) == NULL )
  1063.         {
  1064.             FREE(pImageBuf);
  1065.             return -2;
  1066.         }
  1067.         if ((bbuf = MALLOC(524288)) == NULL )
  1068.         {
  1069.             FREE(rbuf);
  1070.             FREE(pImageBuf);
  1071.             return -2;
  1072.         }
  1073.       // パラメータ設定
  1074.         if (!para->add)
  1075.         {
  1076.             svar.frame = 0 ;
  1077.             svar.total_byte = 0 ;
  1078.         }
  1079.         else
  1080.         {
  1081.             if ((err = mov_head_read(pszMovName)) != 0)
  1082.                 goto END;
  1083.         }
  1084.         svar.rough = para->rough;
  1085.         svar.premove = (para->premove ? 1 : 0) * 8 ;
  1086.         svar.soft = para->soft;
  1087.         svar.wait = para->wait;
  1088.  
  1089.       // 新規作成の場合、フレームの縦横ドット数を得る
  1090.         if ( nTotalFrame > 0 && svar.frame == 0 )
  1091.         {
  1092.             svar.x0 = 0 ;
  1093.             svar.y0 = 0 ;
  1094.             svar.x1 = 319;
  1095.             svar.y1 = 239;
  1096.             int ret = (*pfnLoadFrame)( pImageBuf, 0, &nFrameWid, &nFrameHt );
  1097.             if (ret == 0)
  1098.             {
  1099.                 svar.x1 = _min(319, nFrameWid - 1);
  1100.                 svar.y1 = _min(239, nFrameHt - 1);
  1101.             }
  1102.         }
  1103.       // 各フレームについて圧縮保存
  1104.         int iFrame;
  1105.         for (iFrame = 0; iFrame < nTotalFrame; iFrame++)
  1106.         {
  1107.             if (pfnCheckFrame != 0)
  1108.                 (*pfnCheckFrame)(iFrame);
  1109.             int ret;
  1110.             ret = (*pfnLoadFrame)(pImageBuf,iFrame,NULL,NULL);
  1111.             if (ret == 0) {
  1112.                 if ((err = mov_save_page(pszMovName)) != 0)
  1113.                     goto END;
  1114.                 // memcpy(pImageBuf, rbuf, 320*240*2);
  1115.                     // フィルタ処理後の画像を画面に表示??
  1116.             }
  1117.             // マウスのクリック(中止)のチェックをここでする
  1118.         }
  1119.       END:
  1120.         FREE(bbuf);
  1121.         FREE(rbuf);
  1122.         FREE(pImageBuf);
  1123.         return err;
  1124.     }
  1125.